/*
 * Copyright (c) 2013 Björn Aili
 *
 * This software is provided 'as-is', without any express or implied
 * warranty. In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source
 * distribution.
 */
#ifndef FTL_CONCEPTS_COMMON_H
#define FTL_CONCEPTS_COMMON_H

namespace ftl {
	
	/**
	 * \page concepts Concepts
	 *
	 * \subpage applicativepg
	 * \subpage assignable
	 * \subpage copyassignable
	 * \subpage copycons
	 * \subpage defcons
	 * \subpage destructible
	 * \subpage deref
	 * \subpage empty
	 * \subpage eq
	 * \subpage foldablepg
	 * \subpage fullycons
	 * \subpage fwditerable
	 * \subpage fn
	 * \subpage functorpg
	 * \subpage monadpg
	 * \subpage monoidpg
	 * \subpage monoidapg
	 * \subpage moveassignable
	 * \subpage movecons
	 * \subpage orderablepg
	 * \subpage zippablepg
	 */

	/**
	 * Derived concept implementation tag for any mutable container type.
	 *
	 * This tag can be used with some _deriving_ constructs to generate an
	 * automatic/default implementation of certain concept methods.
	 *
	 * \tparam M must be \ref fwditerable and Insertable.
	 *
	 * \ingroup concept_common
	 */
	template<typename M>
	struct back_insertable_container {};

	/**
	 * Tag used to derive a BidirectionalIterable specific concept instance/method.
	 *
	 * Some _deriving_ are specialised for this tag to provide a semi-automatic
	 * implementation of a concept.
	 *
	 * \tparam It must be BidirectionalIterable.
	 *
	 * \ingroup concept_common
	 */
	template<typename It>
	struct bidirectional_iterable {};

}

#endif

